package com.notes.algo.exam;

/**
 * @author
 * @Describe 在日常开发中，我们经常会用的有2进制、10进制、16进制，A系统需要一个进制转换功能，请实现10进制与任意进制（进制36以内）互转函数
 * @date
 */
public class Solution1 {
    public static void main(String[] args) {
        System.out.println(baseNToBase10("10101", 2));
        System.out.println(baseNToBase10("75", 8));
        System.out.println(baseNToBase10("AB9", 16));
        System.out.println(base10ToBaseN(21, 2));
        System.out.println(base10ToBaseN(61, 8));
        System.out.println(base10ToBaseN(2745, 16));
    }

    /**
     * 功能：N进制转10进制
     * 参数：
     * pInStr: N进制字符串
     * iBase:表示几进制
     * 返回值：
     * 返回十进制整数值。
     */
    public static int baseNToBase10(String iStr, int iBase) {
        if (iBase < 1 || iBase > 36) {
            throw new java.lang.RuntimeException();
        }
        int length = iStr.length();
        double r = 0;
        // 用于获取当前字符对应的数值
        String constantStr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        // 遍历输入的字符串，
        for (int i = length - 1; i >= 0; i--) {
            char cur = iStr.charAt(i);
            int indexOf = constantStr.indexOf(cur);
            // 1.使用Math.pow求进制数的平方
            // r += indexOf * java.lang.Math.pow(iBase, (length - i - 1));
            // 2.求进制数的平方
            int tmp = 1;
            for (int j = 0; j < length - i - 1; j++) {
                tmp = iBase * tmp;
            }

            r += indexOf * tmp;
        }

        return Double.valueOf(r).intValue();
    }

    /**
     * 函数功能：实现10进制转N进制
     * 参数说明：
     * iSrc: 10进制整数值。
     * iBase:目标进制
     * pOutStr: 将iSrc转换成N进制以后的字符串。
     * 返回值：
     * 0成功, 其他失败。
     */
    public static int base10ToBaseN(int iSrc, int iBase, String iStr) {
        if (iBase < 1 || iBase > 36) {
            throw new java.lang.RuntimeException();
        }

        String s = base10ToBaseN(iSrc, iBase);

        return s.equals(iStr) ? 0 : -1;
    }

    public static String base10ToBaseN(int iSrc, int iBase) {
        if (iBase < 1 || iBase > 36) {
            throw new java.lang.RuntimeException();
        }
        // 用于获取当前字符对应的数值
        String constantStr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String r = "";

        // 除值
        int i = 0;
        while ((i = iSrc / iBase) != 0) {
            // 余数
            int i1 = iSrc % iBase;
            // 获取对应进制数的值
            String baseV = constantStr.substring(i1, i1 + 1);
            r = baseV + r;
            iSrc = i;
        }

        // 最后值
        int endIndex = iSrc % iBase;
        return constantStr.substring(endIndex, endIndex + 1) + r;
    }
}
